/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistence;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Micosil
 */
public class ConversationFactory {
    
    private static ConversationPersistence convPerm = null;

    public ConversationFactory() {
    }
    
    public static ConversationPersistence getConversationPersistence(){
        if (convPerm == null) {
            String persistenceType = null;
            BufferedReader configReader = null;
            
            //Leemos la primera línea del archivo de configuración.
            try {
                configReader = new BufferedReader(new FileReader(new File("Config.txt")));

                try {
                    persistenceType = configReader.readLine();
                } catch (IOException ex) {
                    Logger.getGlobal().log(Level.SEVERE, "Persistence configuration IO Error", ex);
                }

            } catch (FileNotFoundException ex) {
                Logger.getGlobal().log(Level.WARNING, "Persistence configuration not found. Defaulting to memory.", ex);
                persistenceType = "Memory";
            } 
            

            //Añadimos el directorio de persistencia al path
            URLClassLoader classLoader = null;
            try {
                classLoader = URLClassLoader.newInstance(new URL[]{new File("./build/classes/persistence").toURI().toURL()});
            } catch (MalformedURLException ex) {
                Logger.getGlobal().log(Level.SEVERE, "The programmer sucks!", ex);
            }
            
            
            //Buscamos en el directorio la clase pedida por el archivo de configuración
            Class persistenceClass = null;
            try {
                persistenceClass = Class.forName("Persistence.Conversation" + persistenceType, true, classLoader);
            } catch (ClassNotFoundException ex) {
                Logger.getGlobal().log(Level.WARNING, "Persistence class ServidorPED.Persistence.Conversation" + persistenceType + " not found. Defaulting to memory.", ex);
                convPerm = new ConversationMemory("Config.txt");
            }
            try {               
                
                //Traducción de esta línea: Buscamos el constructor de la clase que acepta un String como parámetro y le pasamos la siguiente línea del archivo de configuración.
                convPerm = (ConversationPersistence) persistenceClass.getConstructor(Class.forName("java.lang.String")).newInstance((Object) "Config.txt");
            } catch (Exception ex) {
                Logger.getGlobal().log(Level.SEVERE, "Look, this thing can blow up in twelve places. Don't ask me...", ex);
            }finally{
                try { if (configReader != null)
                    configReader.close();
                } catch (IOException ex) {
                    Logger.getGlobal().log(Level.SEVERE, "Could not close configuration file stream." , ex);
                }
            }
        }
        return (convPerm);
        
    }
}
